package net.linku.annotation;

import com.baomidou.mybatisplus.extension.service.IService;
import net.linku.annotation.change.service.impl.DefaultContentParse;

import java.lang.annotation.*;

/**
 * 用于记录数据变更日志的注解
 * 通过该注解，可以在方法执行前后记录数据的变更情况
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ChangeRecordLog {

    /**
     * 获取编辑信息的解析类，目前为使用id获取。
     * 默认为 DefaultContentParse 类。
     *
     * @return 解析类的 Class 类型
     */
    Class parseclass() default DefaultContentParse.class;

    /**
     * 查询数据库所调用的 Service 类，包含 selectById 方法。
     * 默认为 IService 类。
     *
     * @return Service 类的 Class 类型
     */
    Class serviceclass() default IService.class;

    /**
     * 操作对象的id字段名称，默认为主键 "id"。
     *
     * @return id 字段名称
     */
    String keyId() default "id";

    /**
     * 是否需要比较对象前后值，默认为 true。
     *
     * @return 布尔值，表示是否需要比较
     */
    boolean needCompare() default true;

    /**
     * 业务类型，用于指定数据变更的业务场景。
     *
     * @return 业务类型的枚举值
     */
    ChangeRecordEnums.TYPE businessType();

    /**
     * 操作类型，用于指定数据变更的具体操作，如新增、修改、删除等。
     *
     * @return 操作类型的枚举值
     */
    ChangeRecordEnums.ACTION action();

    /**
     * 主键id参数，支持Spring EL表达式。
     *
     * @return 主键id参数的表达式字符串
     */
    String param() default "";

    /**
     * 变更类型，用于指定数据变更的类型，如逻辑删除、物理删除等。
     *
     * @return 变更类型的枚举值
     */
    ChangeRecordEnums.CHANGE_TYPE changeType();

    /**
     * 描述信息，用于记录变更操作的详细描述。
     *
     * @return 描述信息的字符串
     */
    String desc() default "";
}
